home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / workbench / c / mount.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  6KB  |  269 lines

  1. /*
  2.     (C) 1995-97 AROS - The Amiga Replacement OS
  3.     $Id: mount.c,v 1.8 1997/01/27 13:17:32 digulla Exp $
  4.  
  5.     Desc: Mount CLI command
  6.     Lang: english
  7. */
  8.  
  9. #include <exec/memory.h>
  10. #include <proto/exec.h>
  11. #include <dos/dosextens.h>
  12. #include <dos/filesystem.h>
  13. #include <dos/rdargs.h>
  14. #include <proto/dos.h>
  15. #include <proto/utility.h>
  16.  
  17. static struct UtilityBase *UtilityBase;
  18.  
  19. LONG readfile(STRPTR name, STRPTR *mem, LONG *size)
  20. {
  21.     BPTR ml;
  22.     ULONG rest,sub;
  23.     STRPTR buf;
  24.     ml=Open(name,MODE_OLDFILE);
  25.     if(ml)
  26.     {
  27.     if(Seek(ml,0,OFFSET_END)!=-1)
  28.     {
  29.         *size=Seek(ml,0,OFFSET_BEGINNING);
  30.         if(*size!=-1)
  31.         {
  32.         *mem=(STRPTR)AllocVec(*size,MEMF_ANY);
  33.         if(*mem!=NULL)
  34.         {
  35.             rest=*size;
  36.             buf=*mem;
  37.             for(;;)
  38.             {
  39.             if(!rest)
  40.             {
  41.                 Close(ml);
  42.                 return 0;
  43.             }
  44.             sub=Read(ml,buf,rest);
  45.             if(sub==-1)
  46.                 break;
  47.             rest-=sub;
  48.             buf+=sub;
  49.             }
  50.             FreeVec(*mem);
  51.         }else
  52.             SetIoErr(ERROR_NO_FREE_STORE);
  53.         }
  54.     }
  55.     Close(ml);
  56.     }
  57.     return IoErr();
  58. }
  59.  
  60. static void preparefile(STRPTR buf, LONG size)
  61. {
  62.     STRPTR end=buf+size;
  63.     while(buf<end)
  64.     {
  65.     /* Convert comments to spaces */
  66.     if(buf+1<end&&*buf=='/'&&buf[1]=='*')
  67.     {
  68.         *buf++=' ';
  69.         *buf++=' ';
  70.         while(buf<end)
  71.         {
  72.         if(*buf=='*')
  73.         {
  74.             *buf++=' ';
  75.             if(buf>=end)
  76.             break;
  77.             if(*buf=='/')
  78.             {
  79.             *buf++=' ';
  80.             break;
  81.             }
  82.         }
  83.         *buf++=' ';
  84.         }
  85.         continue;
  86.     }
  87.     /* Skip strings */
  88.     if(*buf=='\"')
  89.     {
  90.         while(buf<end&&*buf!='\"')
  91.         {
  92.         if(*buf++=='*'&&buf<end)
  93.             buf++;
  94.         }
  95.         continue;
  96.     }
  97.     /* Convert '\n' and ';' to spaces */
  98.     if(*buf=='\n'||*buf==';')
  99.     {
  100.         *buf++=' ';
  101.         continue;
  102.     }
  103.     /* Convert '#' to NUL */
  104.     if(*buf=='#')
  105.     {
  106.         *buf++=0;
  107.         continue;
  108.     }
  109.     /* Skip all other characters */
  110.     buf++;
  111.     }
  112. }
  113.  
  114. static LONG mountdevice(struct IOFileSys *iofs, STRPTR filesys, STRPTR device)
  115. {
  116.     struct DosList *entry;
  117.     LONG error;
  118.     entry=MakeDosEntry(device,DLT_DEVICE);
  119.     if(entry!=NULL)
  120.     {
  121.     if(!OpenDevice(filesys,0,&iofs->IOFS,0))
  122.     {
  123.         if(AddDosEntry(entry))
  124.         {
  125.         entry->dol_Unit  =iofs->IOFS.io_Unit;
  126.         entry->dol_Device=iofs->IOFS.io_Device;
  127.         /*
  128.             Neither close the device nor free the DosEntry.
  129.             Both will stay in the dos list as long as the
  130.             device is mounted.
  131.         */
  132.         return 0;
  133.         }
  134.         else
  135.         error=IoErr();
  136.     }
  137.     else
  138.         error=ERROR_OBJECT_NOT_FOUND;
  139.  
  140.     FreeDosEntry(entry);
  141.     }
  142.     else
  143.     error=ERROR_NO_FREE_STORE;
  144.  
  145.     return error;
  146. }
  147.  
  148. static const UBYTE options[]=
  149. "HANDLER=FILESYSTEM/A/K,DEVICE/K,UNIT/K/N,BLOCKSIZE/K/N,SURFACES/K/N,"
  150. "BLOCKSPERTRACK/K/N,RESERVED/K/N,INTERLEAVE/K/N,LOWCYL/K/N,HIGHCYL/K/N,"
  151. "BUFFERS/K/N,BUFMEMTYPE/K/N,MAXTRANSFER/K/N,MASK/K/N,BOOTPRI/K/N,"
  152. "DOSTYPE/K/N,BAUD/K/N,CONTROL/K";
  153.  
  154. static LONG mount(STRPTR name, STRPTR buf, LONG size, struct IOFileSys *iofs)
  155. {
  156.     IPTR *args[18]=
  157.     { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  158.       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
  159.     IPTR vec[20];
  160.     UBYTE buffer[1024];
  161.     LONG error, res;
  162.     STRPTR end=buf+size, s2;
  163.     struct RDArgs *rd;
  164.     struct RDArgs rda=
  165.     { { NULL, 0, 0 }, 0, NULL, 0, NULL, RDAF_NOPROMPT };
  166.     rda.RDA_Source.CS_Buffer=buf;
  167.     rda.RDA_Source.CS_Length=end-buf;
  168.     rda.RDA_Source.CS_CurChr=0;
  169.     while(rda.RDA_Source.CS_CurChr<rda.RDA_Source.CS_Length)
  170.     {
  171.     res=ReadItem(buffer,1024,&rda.RDA_Source);
  172.     if(res==ITEM_ERROR)
  173.         return IoErr();
  174.     if(res==ITEM_NOTHING&&rda.RDA_Source.CS_CurChr==rda.RDA_Source.CS_Length)
  175.         return 0;
  176.     if(res!=ITEM_QUOTED&&res!=ITEM_UNQUOTED)
  177.         return 1;
  178.     s2=buffer;
  179.     while(*s2)
  180.         s2++;
  181.     if(s2==buffer||s2[-1]!=':')
  182.         return 1;
  183.     *--s2=0;
  184.     if(!Strnicmp(name,buffer,s2-buffer)&&
  185.        (!name[s2-buffer]||(name[s2-buffer]==':'||!name[s2-buffer+1])))
  186.     {
  187.         rd=ReadArgs((STRPTR)options,(LONG *)args,&rda);
  188.         if(rd==NULL)
  189.         return IoErr();
  190.         vec[DE_TABLESIZE]    =19;
  191.         vec[DE_SIZEBLOCK]    =(args[3]?*args[3]:512)/4;
  192.         vec[DE_BLOCKSIZE]    =args[3]?*args[3]:512;
  193.         vec[DE_NUMHEADS]    =args[4]?*args[4]:2;
  194.         vec[DE_BLKSPERTRACK]=args[5]?*args[5]:11;
  195.         vec[DE_RESERVEDBLKS]=args[6]?*args[6]:2;
  196.         vec[DE_INTERLEAVE]    =args[7]?*args[7]:0;
  197.         vec[DE_LOWCYL]    =args[8]?*args[8]:0;
  198.         vec[DE_HIGHCYL]    =args[9]?*args[9]:79;
  199.         vec[DE_NUMBUFFERS]    =args[10]?*args[10]:20;
  200.         vec[DE_BUFMEMTYPE]    =args[11]?*args[11]:1;
  201.         vec[DE_MAXTRANSFER] =args[12]?*args[12]:~0ul;
  202.         vec[DE_MASK]    =args[13]?*args[13]:~0ul;
  203.         vec[DE_BOOTPRI]    =args[14]?*args[14]:0;
  204.         vec[DE_DOSTYPE]    =args[15]?*args[15]:0x444f5301;
  205.         vec[DE_BAUD]    =args[16]?*args[16]:9600;
  206.         vec[DE_CONTROL]    =args[17]?*args[17]:(IPTR)"";
  207.         vec[DE_BOOTBLOCKS]    =0;
  208.         iofs->io_Args[0]=args[1]?(IPTR)args[1]:(IPTR)"trackdisk.device";
  209.         iofs->io_Args[1]=args[2]?*args[2]:0;
  210.         iofs->io_Args[2]=(IPTR)vec;
  211.         error=mountdevice(iofs,(STRPTR)args[0],buffer);
  212.         FreeArgs(rd);
  213.         return error;
  214.     }
  215.     while(rda.RDA_Source.CS_CurChr<rda.RDA_Source.CS_Length)
  216.         if(!rda.RDA_Source.CS_Buffer[rda.RDA_Source.CS_CurChr++])
  217.         break;
  218.     }
  219.     return 1;
  220. }
  221.  
  222. int main (int argc, char ** argv)
  223. {
  224.     STRPTR args[2]={ NULL, "Devs:Mountlist" };
  225.     struct RDArgs *rda;
  226.     struct IOFileSys *iofs;
  227.     STRPTR mem;
  228.     LONG size;
  229.     struct Process *me=(struct Process *)FindTask(NULL);
  230.     LONG error=0;
  231.  
  232.     UtilityBase=(struct UtilityBase *)OpenLibrary("utility.library",0);
  233.     if(UtilityBase!=NULL)
  234.     {
  235.     rda=ReadArgs("DEVICE/M,FROM/K",(ULONG *)args,NULL);
  236.     if(rda!=NULL)
  237.     {
  238.         error=readfile(args[1],&mem,&size);
  239.         if(!error)
  240.         {
  241.         preparefile(mem,size);
  242.         iofs=(struct IOFileSys *)CreateIORequest(&me->pr_MsgPort,sizeof(struct IOFileSys));
  243.         if(iofs!=NULL)
  244.         {
  245.             STRPTR *dev=(STRPTR *)args[0];
  246.             while(*dev)
  247.             {
  248.             error=mount(*dev++,mem,size,iofs);
  249.             if(error)
  250.                 break;
  251.             }
  252.             DeleteIORequest(&iofs->IOFS);
  253.         }else
  254.             error=ERROR_NO_FREE_STORE;
  255.         FreeVec(mem);
  256.         }
  257.         FreeArgs(rda);
  258.     }else
  259.         error=IoErr();
  260.     }else
  261.     error=ERROR_OBJECT_NOT_FOUND;
  262.     if(error)
  263.     {
  264.     PrintFault(error,"Mount");
  265.     return RETURN_FAIL;
  266.     }
  267.     return RETURN_OK;
  268. }
  269.